import axios from "axios";
import { refreshToken } from "@/api/user";
import router from "@/router";
const request = axios.create({
  baseURL: " /api",
  timeout: 3000,
  // headers: {
  //   "Content-Type": "application/json",
  // },
});
request.interceptors.request.use((config) => {
  config.data = JSON.stringify(config.data);
  // 不要覆盖 Content-Type
  // if (!config.headers["Content-Type"]) {
  //   config.headers["Content-Type"] = "application/json";
  // }
  const token = localStorage.getItem("access_token");
  config.headers = {
    ...config.headers,
    Authorization: token ? "Bearer " + token : "",
  };
  return config;
});
request.interceptors.response.use(
  async (res) => {
    // 成功响应处理
    return res;
  },
  async (error) => {
    // 接收到响应数据并成功后的一些共有的处理，关闭loading等
    // res为回调函数，也就是接口请求成功后返回的数据
    // res.data.meta.status为当前res接口的状态
    console.log("响应拦截", error);
    let status = error.response?.status || "";

    // switch函数判断
    switch (status) {
      case 419:
        console.log("419");

        try {
          console.log("刷新成功");
          if (localStorage.getItem("refresh_token")) {
            let result = await refreshToken({
              refresh: localStorage.getItem("refresh_token"),
            });

            if (result.status == 200) {
              localStorage.setItem("access_token", result.data.access);
              // // 令牌刷新成功，更新请求头中的令牌，并重新发送挂起的请求
              error.config.headers["Authorization"] =
                "Bearer " + result.data.access;
              // 重新发送原始请求
              // 尝试将请求体反序列化为对象
              error.config.data = JSON.parse(error.config.data);
              return request(error.config);
            }
          }
        } catch (error) {
          alert("刷新令牌失败，请重新登录");
          localStorage.removeItem("refresh_token");
          // 跳转到登录页面
          router.push("/login");
        }
        // alert(error.response.data.error);
        break;
      case 401:
        errMessage = "未授权，请重新登录";
        break;
      case 403:
        alert(error.response.data.error);
        break;
      case 404:
        alert(error.response.data.error);
        break;
      case 422:
        alert(error.response.data.error);
        break;
      case 500:
        alert(error.response.data.error);
        break;
      default:
        break;
    }
    // 响应拦截器执行完后需要将接口返回的数据也就是res回调函数，return给到之后的请求方法
    // 返回 Promise 拒绝以便调用者进行特殊处理
    // return Promise.reject(error);
  }
);

export default request;
